ফ্রন্টএন্ড ডেভেলপমেন্টে মিডিয়াস্ট্রিম ট্র্যাকের জটিলতাগুলি অন্বেষণ করুন, যেখানে মিডিয়া অ্যাপ্লিকেশন তৈরির জন্য এর সৃষ্টি, পরিবর্তন, সীমাবদ্ধতা এবং উন্নত কৌশল আলোচনা করা হয়েছে।
ফ্রন্টএন্ড মিডিয়াস্ট্রিম ট্র্যাক: মিডিয়া ট্র্যাক ম্যানেজমেন্টের জন্য একটি বিস্তারিত গাইড
MediaStreamTrack ইন্টারফেসটি একটি MediaStream এর মধ্যে একটি একক মিডিয়া ট্র্যাককে বোঝায়। এই ট্র্যাকটিতে অডিও বা ভিডিও থাকতে পারে। ওয়েবে শক্তিশালী এবং ইন্টারেক্টিভ মিডিয়া অ্যাপ্লিকেশন তৈরির জন্য এই ট্র্যাকগুলি কীভাবে পরিচালনা করতে হয় তা বোঝা অত্যন্ত গুরুত্বপূর্ণ। এই বিস্তারিত গাইডটি আপনাকে ফ্রন্টএন্ড ডেভেলপমেন্টে মিডিয়াস্ট্রিম ট্র্যাক তৈরি, পরিবর্তন এবং পরিচালনার ধাপগুলির মধ্যে দিয়ে নিয়ে যাবে।
মিডিয়াস্ট্রিম ট্র্যাক কী?
একটি MediaStream হলো মিডিয়া কন্টেন্টের একটি স্ট্রিম, যাতে একাধিক MediaStreamTrack অবজেক্ট থাকতে পারে। প্রতিটি ট্র্যাক অডিও বা ভিডিওর একটি একক উৎসকে প্রতিনিধিত্ব করে। এটিকে এমন একটি কন্টেইনার হিসেবে ভাবুন যা অডিও বা ভিডিও ডেটার একটি স্ট্রিম ধরে রাখে।
মূল বৈশিষ্ট্য এবং মেথড
kind: একটি রিড-অনলি স্ট্রিং যা ট্র্যাকের ধরন নির্দেশ করে ("audio"অথবা"video")।id: একটি রিড-অনলি স্ট্রিং যা ট্র্যাকের জন্য একটি ইউনিক আইডেন্টিফায়ারকে প্রতিনিধিত্ব করে।label: একটি রিড-অনলি স্ট্রিং যা ট্র্যাকের জন্য একটি মানব-পাঠযোগ্য লেবেল প্রদান করে।enabled: একটি বুলিয়ান যা নির্দেশ করে ট্র্যাকটি বর্তমানে সক্রিয় আছে কি না। এটিকেfalseসেট করলে ট্র্যাকটি বন্ধ না করেই মিউট বা নিষ্ক্রিয় হয়ে যায়।muted: একটি রিড-অনলি বুলিয়ান যা নির্দেশ করে যে সিস্টেম-স্তরের সীমাবদ্ধতা বা ব্যবহারকারীর সেটিংসের কারণে ট্র্যাকটি মিউট করা হয়েছে কি না।readyState: একটি রিড-অনলি স্ট্রিং যা ট্র্যাকের বর্তমান অবস্থা নির্দেশ করে ("live","ended")।getSettings(): ট্র্যাকের বর্তমান সেটিংসের একটি ডিকশনারি রিটার্ন করে।getConstraints(): ট্র্যাকটি তৈরি করার সময় প্রয়োগ করা সীমাবদ্ধতার একটি ডিকশনারি রিটার্ন করে।applyConstraints(constraints): ট্র্যাকে নতুন সীমাবদ্ধতা প্রয়োগ করার চেষ্টা করে।clone(): মূল ট্র্যাকের একটি ক্লোন হিসেবে একটি নতুনMediaStreamTrackঅবজেক্ট রিটার্ন করে।stop(): ট্র্যাকটি বন্ধ করে, মিডিয়া ডেটার প্রবাহ শেষ করে দেয়।addEventListener(): আপনাকে ট্র্যাকের ইভেন্টগুলি শোনার অনুমতি দেয়, যেমনendedবাmute।
মিডিয়াস্ট্রিম ট্র্যাক সংগ্রহ করা
MediaStreamTrack অবজেক্টগুলি পাওয়ার প্রধান উপায় হলো getUserMedia() API ব্যবহার করা। এই API ব্যবহারকারীকে তাদের ক্যামেরা এবং মাইক্রোফোন ব্যবহারের অনুমতি চায় এবং অনুমতি পেলে অনুরোধ করা ট্র্যাকগুলি সহ একটি MediaStream রিটার্ন করে।
getUserMedia() ব্যবহার করা
ব্যবহারকারীর ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে getUserMedia() কীভাবে ব্যবহার করবেন তার একটি প্রাথমিক উদাহরণ নিচে দেওয়া হলো:
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(function(stream) {
// Use the stream here.
const videoTrack = stream.getVideoTracks()[0];
const audioTrack = stream.getAudioTracks()[0];
// Example: Display the video in a video element
const videoElement = document.getElementById('myVideo');
videoElement.srcObject = stream;
videoElement.play();
})
.catch(function(err) {
console.log("An error occurred: " + err);
});
ব্যাখ্যা:
navigator.mediaDevices.getUserMedia({ video: true, audio: true }): এটি ভিডিও এবং অডিও উভয় ইনপুট অ্যাক্সেস করার জন্য অনুরোধ করে।getUserMedia-কে দেওয়া অবজেক্টটি অনুরোধ করা মিডিয়ার ধরন নির্ধারণ করে।.then(function(stream) { ... }): যখন ব্যবহারকারী অনুমতি দেয় এবং একটিMediaStreamসফলভাবে পাওয়া যায়, তখন এটি কার্যকর হয়।stream.getVideoTracks()[0]: এটি স্ট্রিম থেকে প্রথম ভিডিও ট্র্যাকটি সংগ্রহ করে। একটি স্ট্রিমে একই ধরনের একাধিক ট্র্যাক থাকতে পারে।stream.getAudioTracks()[0]: এটি স্ট্রিম থেকে প্রথম অডিও ট্র্যাকটি সংগ্রহ করে।videoElement.srcObject = stream: এটি একটি ভিডিও এলিমেন্টেরsrcObject-কেMediaStream-এ সেট করে, যার ফলে ভিডিওটি দেখানো যায়।videoElement.play(): ভিডিও প্লেব্যাক শুরু করে।.catch(function(err) { ... }): যদি কোনো ত্রুটি ঘটে, যেমন ব্যবহারকারী অনুমতি প্রত্যাখ্যান করলে, এটি কার্যকর হয়।
সীমাবদ্ধতা (Constraints)
সীমাবদ্ধতা আপনাকে মিডিয়া ট্র্যাকের জন্য প্রয়োজনীয়তা নির্দিষ্ট করতে দেয়, যেমন রেজোলিউশন, ফ্রেম রেট এবং অডিওর মান। এটি আপনার অ্যাপ্লিকেশনকে তার নির্দিষ্ট চাহিদা পূরণকারী মিডিয়া ডেটা পেতে নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। সীমাবদ্ধতাগুলি getUserMedia() কলের মধ্যে নির্দিষ্ট করা যেতে পারে।
navigator.mediaDevices.getUserMedia({
video: {
width: { min: 640, ideal: 1280, max: 1920 },
height: { min: 480, ideal: 720, max: 1080 },
frameRate: { ideal: 30, max: 60 }
},
audio: {
echoCancellation: { exact: true },
noiseSuppression: { exact: true }
}
})
.then(function(stream) {
// ...
})
.catch(function(err) {
console.log("An error occurred: " + err);
});
ব্যাখ্যা:
width: { min: 640, ideal: 1280, max: 1920 }: এটি নির্দিষ্ট করে যে ভিডিওর প্রস্থ কমপক্ষে ৬৪০ পিক্সেল, আদর্শগতভাবে ১২৮০ পিক্সেল এবং সর্বোচ্চ ১৯২০ পিক্সেল হওয়া উচিত। ব্রাউজার এই সীমাবদ্ধতা সমর্থন করে এমন একটি ক্যামেরা খুঁজে বের করার চেষ্টা করবে।height: { min: 480, ideal: 720, max: 1080 }: প্রস্থের মতোই, এটি ভিডিওর কাঙ্ক্ষিত উচ্চতা নির্ধারণ করে।frameRate: { ideal: 30, max: 60 }: এটি আদর্শগতভাবে প্রতি সেকেন্ডে ৩০ ফ্রেম এবং সর্বোচ্চ প্রতি সেকেন্ডে ৬০ ফ্রেমের একটি ফ্রেম রেটের জন্য অনুরোধ করে।echoCancellation: { exact: true }: এটি অডিও ট্র্যাকের জন্য ইকো ক্যান্সেলেশন সক্রিয় করার অনুরোধ করে।exact: trueএর অর্থ হলো ব্রাউজারকে অবশ্যই ইকো ক্যান্সেলেশন প্রদান করতে হবে, অন্যথায় অনুরোধটি ব্যর্থ হবে।noiseSuppression: { exact: true }: এটি অডিও ট্র্যাকের জন্য নয়েজ সাপ্রেশন সক্রিয় করার অনুরোধ করে।
এটি মনে রাখা গুরুত্বপূর্ণ যে ব্রাউজার হয়তো সমস্ত সীমাবদ্ধতা পূরণ করতে সক্ষম নাও হতে পারে। আপনি MediaStreamTrack-এ getSettings() ব্যবহার করে প্রকৃত সেটিংসগুলি নির্ধারণ করতে পারেন যা প্রয়োগ করা হয়েছিল।
মিডিয়াস্ট্রিম ট্র্যাক পরিবর্তন করা
একবার আপনি একটি MediaStreamTrack পেয়ে গেলে, আপনি অডিও এবং ভিডিও আউটপুট নিয়ন্ত্রণ করতে বিভিন্ন উপায়ে এটি পরিবর্তন করতে পারেন।
ট্র্যাক সক্রিয় এবং নিষ্ক্রিয় করা
আপনি enabled প্রপার্টি ব্যবহার করে একটি ট্র্যাক সক্রিয় বা নিষ্ক্রিয় করতে পারেন। enabled-কে false সেট করলে একটি অডিও ট্র্যাক কার্যকরভাবে মিউট হবে বা একটি ভিডিও ট্র্যাক বন্ধ না করেই নিষ্ক্রিয় হয়ে যাবে। এটিকে আবার true তে সেট করলে ট্র্যাকটি পুনরায় সক্রিয় হবে।
const videoTrack = stream.getVideoTracks()[0];
// Disable the video track
videoTrack.enabled = false;
// Enable the video track
videoTrack.enabled = true;
এটি মিউট বোতাম এবং ভিডিও টগলের মতো বৈশিষ্ট্যগুলি প্রয়োগ করার জন্য দরকারী।
তৈরির পরে সীমাবদ্ধতা প্রয়োগ করা
আপনি একটি ট্র্যাক তৈরি করার পরে তার সীমাবদ্ধতা পরিবর্তন করতে applyConstraints() মেথডটি ব্যবহার করতে পারেন। এটি আপনাকে ব্যবহারকারীর পছন্দ বা নেটওয়ার্ক অবস্থার উপর ভিত্তি করে গতিশীলভাবে অডিও এবং ভিডিও সেটিংস সামঞ্জস্য করতে দেয়। তবে, ট্র্যাক তৈরি হওয়ার পরে কিছু সীমাবদ্ধতা পরিবর্তনযোগ্য নাও হতে পারে। applyConstraints()-এর সাফল্য অন্তর্নিহিত হার্ডওয়্যারের ক্ষমতা এবং ট্র্যাকের বর্তমান অবস্থার উপর নির্ভর করে।
const videoTrack = stream.getVideoTracks()[0];
videoTrack.applyConstraints({ frameRate: { ideal: 24 } })
.then(function() {
console.log("Constraints applied successfully.");
})
.catch(function(err) {
console.log("Failed to apply constraints: " + err);
});
ট্র্যাক বন্ধ করা
একটি ট্র্যাক সম্পূর্ণরূপে বন্ধ করতে এবং অন্তর্নিহিত রিসোর্সগুলি ছেড়ে দিতে, আপনি stop() মেথডটি ব্যবহার করতে পারেন। ক্যামেরা এবং মাইক্রোফোন যখন আর প্রয়োজন হয় না, তখন সেগুলি মুক্ত করার জন্য এটি গুরুত্বপূর্ণ, বিশেষ করে মোবাইল ডিভাইসের মতো সম্পদ-সীমাবদ্ধ পরিবেশে। একবার একটি ট্র্যাক বন্ধ হয়ে গেলে, এটি পুনরায় চালু করা যায় না। আপনাকে getUserMedia() ব্যবহার করে একটি নতুন ট্র্যাক সংগ্রহ করতে হবে।
const videoTrack = stream.getVideoTracks()[0];
// Stop the track
videoTrack.stop();
যখন আপনি পুরো MediaStream-এর কাজ শেষ করে ফেলবেন, তখন সেটি বন্ধ করে দেওয়া একটি ভালো অভ্যাস:
stream.getTracks().forEach(track => track.stop());
উন্নত কৌশল
মৌলিক বিষয়গুলির বাইরে, বেশ কিছু উন্নত কৌশল রয়েছে যা আপনি MediaStreamTrack অবজেক্টগুলিকে আরও উন্নত ও পরিবর্তন করতে ব্যবহার করতে পারেন।
ট্র্যাক ক্লোন করা
clone() মেথডটি একটি নতুন MediaStreamTrack অবজেক্ট তৈরি করে যা মূলটির একটি অনুলিপি। ক্লোন করা ট্র্যাকটি একই অন্তর্নিহিত মিডিয়া উৎস শেয়ার করে। এটি তখন দরকারী যখন আপনাকে একই মিডিয়া উৎস একাধিক জায়গায় ব্যবহার করতে হয়, যেমন একাধিক ভিডিও এলিমেন্টে একই ভিডিও দেখানো।
const originalTrack = stream.getVideoTracks()[0];
const clonedTrack = originalTrack.clone();
// Create a new MediaStream with the cloned track
const clonedStream = new MediaStream([clonedTrack]);
// Display the cloned stream in another video element
const videoElement2 = document.getElementById('myVideo2');
videoElement2.srcObject = clonedStream;
videoElement2.play();
মনে রাখবেন যে মূল ট্র্যাকটি বন্ধ করলে ক্লোন করা ট্র্যাকটিও বন্ধ হয়ে যাবে, কারণ তারা একই অন্তর্নিহিত মিডিয়া উৎস শেয়ার করে।
অডিও এবং ভিডিও প্রসেসিং
MediaStreamTrack ইন্টারফেসটি নিজে থেকে অডিও বা ভিডিও ডেটা প্রক্রিয়াকরণের জন্য সরাসরি কোনো মেথড প্রদান করে না। তবে, আপনি এটি অর্জন করতে অন্যান্য ওয়েব এপিআই, যেমন ওয়েব অডিও এপিআই এবং ক্যানভাস এপিআই ব্যবহার করতে পারেন।
ওয়েব অডিও এপিআই দিয়ে অডিও প্রসেসিং
আপনি একটি MediaStreamTrack থেকে অডিও ডেটা বিশ্লেষণ এবং পরিবর্তন করতে ওয়েব অডিও এপিআই ব্যবহার করতে পারেন। এটি আপনাকে অডিও ভিজ্যুয়ালাইজেশন, নয়েজ কমানো এবং অডিও এফেক্টসের মতো কাজগুলি করতে দেয়।
const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(stream);
// Create an analyser node to extract audio data
const analyser = audioContext.createAnalyser();
analyser.fftSize = 2048;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
// Connect the source to the analyser
source.connect(analyser);
analyser.connect(audioContext.destination);
function draw() {
requestAnimationFrame(draw);
// Get the frequency data
analyser.getByteFrequencyData(dataArray);
// Use the dataArray to visualize the audio
// (e.g., draw a frequency spectrum on a canvas)
console.log(dataArray);
}
draw();
ব্যাখ্যা:
new AudioContext(): একটি নতুন ওয়েব অডিও এপিআই কনটেক্সট তৈরি করে।audioContext.createMediaStreamSource(stream):MediaStreamথেকে একটি অডিও সোর্স নোড তৈরি করে।audioContext.createAnalyser(): একটি অ্যানালাইজার নোড তৈরি করে, যা অডিও ডেটা বের করতে ব্যবহৃত হতে পারে।analyser.fftSize = 2048: ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT) সাইজ সেট করে, যা ফ্রিকোয়েন্সি বিনের সংখ্যা নির্ধারণ করে।analyser.getByteFrequencyData(dataArray):dataArray-কে ফ্রিকোয়েন্সি ডেটা দিয়ে পূর্ণ করে।- অডিও ভিজ্যুয়ালাইজেশন ক্রমাগত আপডেট করতে
draw()ফাংশনটিrequestAnimationFrame()ব্যবহার করে বারবার কল করা হয়।
ক্যানভাস এপিআই দিয়ে ভিডিও প্রসেসিং
আপনি একটি MediaStreamTrack থেকে ভিডিও ফ্রেম পরিবর্তন করতে ক্যানভাস এপিআই ব্যবহার করতে পারেন। এটি আপনাকে ফিল্টার প্রয়োগ, ওভারলে যোগ করা এবং রিয়েল-টাইম ভিডিও বিশ্লেষণের মতো কাজ করতে দেয়।
const videoElement = document.getElementById('myVideo');
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
function drawFrame() {
requestAnimationFrame(drawFrame);
// Draw the current video frame onto the canvas
ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
// Manipulate the canvas data (e.g., apply a filter)
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
// Apply a simple grayscale filter
const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
data[i] = avg; // red
data[i + 1] = avg; // green
data[i + 2] = avg; // blue
}
// Put the modified data back onto the canvas
ctx.putImageData(imageData, 0, 0);
}
videoElement.addEventListener('play', drawFrame);
ব্যাখ্যা:
- ক্যানভাসকে ক্রমাগত আপডেট করার জন্য
drawFrame()ফাংশনটিrequestAnimationFrame()ব্যবহার করে বারবার কল করা হয়। ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height): বর্তমান ভিডিও ফ্রেমটি ক্যানভাসে আঁকে।ctx.getImageData(0, 0, canvas.width, canvas.height): ক্যানভাস থেকে ইমেজ ডেটা সংগ্রহ করে।- কোডটি পিক্সেল ডেটার মধ্যে দিয়ে যায় এবং একটি গ্রেস্কেল ফিল্টার প্রয়োগ করে।
ctx.putImageData(imageData, 0, 0): পরিবর্তিত ইমেজ ডেটা আবার ক্যানভাসে স্থাপন করে।
WebRTC-এর সাথে মিডিয়াস্ট্রিম ট্র্যাক ব্যবহার
MediaStreamTrack অবজেক্টগুলি WebRTC (ওয়েব রিয়েল-টাইম কমিউনিকেশন)-এর জন্য মৌলিক, যা ব্রাউজারগুলির মধ্যে সরাসরি রিয়েল-টাইম অডিও এবং ভিডিও যোগাযোগ সক্ষম করে। আপনি একটি দূরবর্তী পিয়ারের কাছে অডিও এবং ভিডিও ডেটা পাঠাতে একটি WebRTC RTCPeerConnection-এ MediaStreamTrack অবজেক্ট যোগ করতে পারেন।
const peerConnection = new RTCPeerConnection();
// Add the audio and video tracks to the peer connection
stream.getTracks().forEach(track => {
peerConnection.addTrack(track, stream);
});
// The rest of the WebRTC signaling and connection establishment process would follow here.
এটি আপনাকে ভিডিও কনফারেন্সিং অ্যাপ্লিকেশন, লাইভ স্ট্রিমিং প্ল্যাটফর্ম এবং অন্যান্য রিয়েল-টাইম কমিউনিকেশন টুল তৈরি করতে দেয়।
ব্রাউজার সামঞ্জস্যতা
MediaStreamTrack APIটি ক্রোম, ফায়ারফক্স, সাফারি এবং এজ সহ আধুনিক ব্রাউজারগুলিতে ব্যাপকভাবে সমর্থিত। তবে, MDN Web Docs-এর মতো রিসোর্সগুলিতে সর্বশেষ ব্রাউজার সামঞ্জস্যতার তথ্য পরীক্ষা করা সবসময়ই একটি ভালো অভ্যাস।
সেরা অভ্যাস
- অনুমতি সাবধানে পরিচালনা করুন: ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেসের জন্য ব্যবহারকারীর অনুমতি সর্বদা সুন্দরভাবে পরিচালনা করুন। আপনার অ্যাপ্লিকেশনকে কেন এই ডিভাইসগুলিতে অ্যাক্সেসের প্রয়োজন তার স্পষ্ট ব্যাখ্যা দিন।
- প্রয়োজন না হলে ট্র্যাকগুলি বন্ধ করুন: ক্যামেরা এবং মাইক্রোফোনের রিসোর্সগুলি যখন আর ব্যবহার করা হচ্ছে না, তখন ট্র্যাকগুলি বন্ধ করে ছেড়ে দিন।
- সীমাবদ্ধতা অপ্টিমাইজ করুন: আপনার অ্যাপ্লিকেশনের জন্য সর্বোত্তম মিডিয়া সেটিংস অনুরোধ করতে সীমাবদ্ধতা ব্যবহার করুন। প্রয়োজনের অতিরিক্ত উচ্চ রেজোলিউশন বা ফ্রেম রেট অনুরোধ করা এড়িয়ে চলুন।
- ট্র্যাকের অবস্থা পর্যবেক্ষণ করুন: ট্র্যাকের অবস্থার পরিবর্তনে প্রতিক্রিয়া জানাতে
endedএবংmute-এর মতো ইভেন্টগুলি শুনুন। - বিভিন্ন ডিভাইসে পরীক্ষা করুন: সামঞ্জস্যতা নিশ্চিত করতে আপনার অ্যাপ্লিকেশনটি বিভিন্ন ডিভাইস এবং ব্রাউজারে পরীক্ষা করুন।
- অ্যাক্সেসিবিলিটি বিবেচনা করুন: আপনার অ্যাপ্লিকেশনটি প্রতিবন্ধী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য করে ডিজাইন করুন। বিকল্প ইনপুট পদ্ধতি সরবরাহ করুন এবং নিশ্চিত করুন যে অডিও এবং ভিডিও আউটপুট স্পষ্ট এবং বোধগম্য।
উপসংহার
MediaStreamTrack ইন্টারফেসটি মিডিয়া-সমৃদ্ধ ওয়েব অ্যাপ্লিকেশন তৈরির জন্য একটি শক্তিশালী টুল। কীভাবে মিডিয়া ট্র্যাক তৈরি, পরিবর্তন এবং পরিচালনা করতে হয় তা বোঝার মাধ্যমে, আপনি আপনার ব্যবহারকারীদের জন্য আকর্ষক এবং ইন্টারেক্টিভ অভিজ্ঞতা তৈরি করতে পারেন। এই বিস্তারিত গাইডটি MediaStreamTrack পরিচালনার অপরিহার্য দিকগুলি কভার করেছে, getUserMedia() ব্যবহার করে ট্র্যাক প্রাপ্তি থেকে শুরু করে অডিও এবং ভিডিও প্রসেসিংয়ের মতো উন্নত কৌশল পর্যন্ত। মিডিয়া স্ট্রিমগুলির সাথে কাজ করার সময় ব্যবহারকারীর গোপনীয়তা এবং পারফরম্যান্স অপ্টিমাইজেশনকে অগ্রাধিকার দিতে ভুলবেন না। WebRTC এবং সম্পর্কিত প্রযুক্তিগুলির আরও অন্বেষণ ওয়েব ডেভেলপমেন্টের এই উত্তেজনাপূর্ণ ক্ষেত্রে আপনার সক্ষমতা উল্লেখযোগ্যভাবে বাড়িয়ে তুলবে।